Skip to content

Conversation

@zyn0217
Copy link
Contributor

@zyn0217 zyn0217 commented Dec 10, 2024

For a FunctionParmPackExpr that is used as the argument of a sizeof...(pack) expression, we might exercise the logic that checks the CXXRecordDecl's members regardless of the type being incomplete, when rebuilding the DeclRefExpr into non-ODR-used forms.

Fixes #81436

…ing sizeof...(expr)

For a FunctionParmPackExpr that is used as the argument of a sizeof...(pack)
expression, we might exercise the logic that checks the CXXRecordDecl's
members regardless of the type being incomplete, when rebuilding
the DeclRefExpr into non-ODR-used forms.
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Dec 10, 2024
@llvmbot
Copy link
Member

llvmbot commented Dec 10, 2024

@llvm/pr-subscribers-clang

Author: Younan Zhang (zyn0217)

Changes

For a FunctionParmPackExpr that is used as the argument of a sizeof...(pack) expression, we might exercise the logic that checks the CXXRecordDecl's members regardless of the type being incomplete, when rebuilding the DeclRefExpr into non-ODR-used forms.

Fixes #81436


Full diff: https://github.com/llvm/llvm-project/pull/119344.diff

3 Files Affected:

  • (modified) clang/docs/ReleaseNotes.rst (+1)
  • (modified) clang/lib/Sema/SemaExpr.cpp (+1-1)
  • (modified) clang/test/CXX/temp/temp.decls/temp.variadic/sizeofpack.cpp (+20-1)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 95007f357b766f..c92361afe4eaab 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -796,6 +796,7 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure caused by using ``consteval`` in condition in consumed analyses. (#GH117385)
 - Fix a crash caused by incorrect argument position in merging deduced template arguments. (#GH113659)
 - Fixed a parser crash when using pack indexing as a nested name specifier. (#GH119072) 
+- Fixed a null pointer dereference issue when heuristically computing ``sizeof...(pack)`` expressions. (#GH81436)
 - Fixed an assertion failure caused by mangled names with invalid identifiers. (#GH112205)
 - Fixed an incorrect lambda scope of generic lambdas that caused Clang to crash when computing potential lambda
   captures at the end of a full expression. (#GH115931)
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 14564b99de44c5..66c7d0f541a24e 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -19297,7 +19297,7 @@ static ExprResult rebuildPotentialResultsAsNonOdrUsed(Sema &S, Expr *E,
       if (VD->getType()->isReferenceType())
         return true;
       if (auto *RD = VD->getType()->getAsCXXRecordDecl())
-        if (RD->hasMutableFields())
+        if (RD->hasDefinition() && RD->hasMutableFields())
           return true;
       if (!VD->isUsableInConstantExpressions(S.Context))
         return true;
diff --git a/clang/test/CXX/temp/temp.decls/temp.variadic/sizeofpack.cpp b/clang/test/CXX/temp/temp.decls/temp.variadic/sizeofpack.cpp
index 87c22a0d7e944f..97a0a2b5a9e382 100644
--- a/clang/test/CXX/temp/temp.decls/temp.variadic/sizeofpack.cpp
+++ b/clang/test/CXX/temp/temp.decls/temp.variadic/sizeofpack.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
 // expected-no-diagnostics
 
 namespace pr12262 {
@@ -201,3 +201,22 @@ void func()
 }
 
 }
+
+namespace GH81436 {
+
+template <class E> struct Bar;
+
+template <class E>
+Bar(E) -> Bar<E>;
+
+template <int> struct Foo {};
+
+// Bar<Ts> doesn't have to be of a complete type.
+template <class... Ts>
+auto func() requires requires(Bar<Ts> ...init_lists) {
+  sizeof...(init_lists) > 0;
+} {}
+
+void f() { func<int>(); }
+
+} // namespace GH81436

Copy link
Contributor

@cor3ntin cor3ntin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@zyn0217 zyn0217 merged commit d44518c into llvm:main Dec 10, 2024
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Clang frontend segfaults during CTAD with nested initializer_lists

3 participants